/*
  Generator 函数是 ES6 提供的一种异步编程解决方案，语法行为与传统函数完全不同。

  Generator 函数有多种理解角度。语法上，首先可以把它理解成，Generator 函数是一个状态机，封装了多个内部状态。

  执行 Generator 函数会返回一个遍历器对象，也就是说，Generator 函数除了状态机，还是一个遍历器对象生成函数。返回的遍历器对象，可以依次遍历 Generator 函数内部的每一个状态。

  形式上，Generator 函数是一个普通函数，但是有两个特征。一是，function关键字与函数名之间有一个星号；二是，函数体内部使用yield表达式，定义不同的内部状态（yield在英语里的意思就是“产出”）。

  必须调用遍历器对象的next方法，使得指针移向下一个状态。也就是说，每次调用next方法，内部指针就从函数头部或上一次停下来的地方开始执行，直到遇到下一个yield表达式（或return语句）为止。换言之，Generator 函数是分段执行的，yield表达式是暂停执行的标记，而next方法可以恢复执行

  Generator一定要配合Promise， yield后面必须是promise
*/

// function* fn() {
//   yield "a";
//   yield "b";
//   yield "c";
//   yield "d";
//   return "e";
// }

// const f = fn();
// // f表示一个遍历器对象

// console.log(f.next());
// console.log(f.next());
// console.log(f.next());
// console.log(f.next());
// console.log(f.next());
// console.log(f.next());

const co = require("co");
const fs = require("fs");

const delay = (time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(11111);
    }, time);
  });
};

const read = (url) => {
  return new Promise((resolve, reject) => {
    fs.readFile(url, "utf-8", (err, data) => {
      if (err) throw err;
      resolve(data);
    });
  });
};

function* fn() {
  const res1 = yield delay(2000);
  console.log(res1);
  const res2 = yield read("./01-promise.js");
  console.log(res2);
}

co(fn);
